#include <stdbool.h>
#include <stdlib.h>
#include <stdio.h>
#include <stddef.h>
#include <string.h>

#include "sistema_comandos.h"
#include "gestor.h"

void agregar_resultado(gestor_t *gestor, cola_t *cola_argumentos)
{
	// Obtengo el código
	if(cola_esta_vacia(cola_argumentos))
	{		
		fprintf(stderr,"ERROR: la cola de argumentos esta vacia\n");
		return;
	}	
	char *idr = cola_desencolar(cola_argumentos);
	
	if(!idr)
	{
		fprintf(stderr,"ERROR: idr es NULL\n");
		return;		
	}				
	
	// Obtengo los goles loc
	if(cola_esta_vacia(cola_argumentos))
	{
		fprintf(stderr,"ERROR: faltan los goles del local\n");
		return;
	}	
	char *goles_loc = cola_desencolar(cola_argumentos);
	
	// Obtengo los goles vis
	if(cola_esta_vacia(cola_argumentos))
	{
		fprintf(stderr,"ERROR: faltan los goles del local\n");
		return;
	}
	
	char *goles_vis = cola_desencolar(cola_argumentos);	
		
	// Convierto los goles a int
	int gloc = atoi(goles_loc);
	int gvis = atoi(goles_vis);
	
	// Libero la memoria
	// para los goles
	free(goles_loc);
	free(goles_vis);	
	
	// Valido que los goles no sean < 0
	if(gloc<0 || gvis<0)
	{
		fprintf(stderr,"ERROR: la cantidad de goles no puede ser negativa\n");
		return;
	}
	
	// No se aceptan empates
	if(!gloc && !gvis)
	{
		fprintf(stderr,"ERROR: el resutlado final no puede ser empate\n");
		return;		
	}
	
	int goleadores[gloc + gvis];	
	
	for(int i=0; i<gloc + gvis; i++)
	{
		
		// Valido que no falten argumentos
		if(cola_esta_vacia(cola_argumentos))
		{
			fprintf(stderr,"ERROR: faltan jugadores para la cantidad de goles ingresada\n");
			return;
		}		
			
		char *goleador_char = cola_desencolar(cola_argumentos);
		
		// Convierto el nro de jugador a int
		int goleador = atoi(goleador_char);
		
		goleadores[i] = goleador;
		
		// Libero la memoria
		// para los goles
		free(goleador_char);
	}
	
	// Valido que no sobren argumentos
	if(!cola_esta_vacia(cola_argumentos))
	{
		fprintf(stderr,"ERROR: sobran jugadores para la cantidad de goles ingresada\n");
		return;		
	}
	
	gestor_agregar_resultado(gestor,idr,gloc,gvis,goleadores);
}

void listar_jugadores(gestor_t *gestor, cola_t *cola_argumentos)
{
	if(cola_esta_vacia(cola_argumentos))
	{
		fprintf(stderr,"ERROR: argumentos inválidos\n");
		return;
	}
	
	char *filtro = cola_desencolar(cola_argumentos);
	
	if(cola_esta_vacia(cola_argumentos))
	{
		fprintf(stderr,"ERROR: se necesita el país\n");
		return;
	}
	
	char pais[100];
	int j = 0;
	while(!cola_esta_vacia(cola_argumentos))
	{
		char *p = cola_desencolar(cola_argumentos);
		for(int i=0;p[i]!= '\0';i++)
		{
			pais[j] = p[i];
			j++;
		}
		pais[j] = ' ';			
		j++;		
		free(p);
	}
	
	pais[j-1] = '\0';
	
	gestor_listar_jugadores(gestor,filtro,pais);	
}

void goles_jugador(gestor_t *gestor, cola_t *cola_argumentos)
{
	if(cola_esta_vacia(cola_argumentos))
	{
		fprintf(stderr,"ERROR: la cola de argumentos esta vacia\n");
		return;
	}	
	
	// Como agregué el espacio
	// el nombre vienen en 2 argumentos
	
	char nombre[100];
	
	int j=0;
	
	while(!cola_esta_vacia(cola_argumentos))
	{
		char *p = cola_desencolar(cola_argumentos);
		
		if(!p)
			return;
		
		for(unsigned i=0;i<strlen(p);i++)
		{
			nombre[j] = p[i];
			j++;
		}			
		
		nombre[j] = ' ';
		j++;		
		free(p);
	}
	
	nombre[j-1] = '\0';
	
	 
	if(!strlen(nombre))
		return;
		
	gestor_goles_jugador(gestor,nombre);
}

void mostrar_resultado(gestor_t* gestor,cola_t* cola_argumentos)
{
	if(cola_esta_vacia(cola_argumentos))
	{
		fprintf(stderr,"ERROR: la cola de argumentos esta vacia\n");
		return;
	}
	
	char *idr = cola_desencolar(cola_argumentos);
	if(!idr)
	{
		fprintf(stderr,"ERROR: el idr es NULL\n");
		return;
	}	
		
	gestor_mostrar_resultado(gestor, idr);
}


